package com.sec.etech.file.service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sec.etech.file.mapper.EtechFileModulePowerMapper;
import com.sec.etech.file.model.EtechFile;
import com.sec.etech.sys.util.ContextUtil;
import com.sec.etech.sys.util.DbUtil;
import org.openbpm.base.core.util.StringUtil;
import org.openbpm.sys.api.permission.PermissionCalculatorFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

@Service
public class EtechFileModulePowerService {

    @Resource
    private EtechFileModulePowerMapper powerMapper;


    //兼容旧版本
    public boolean haveSinglePreviewRights(EtechFile file) {
        if(StringUtil.isNotEmpty(file.getRightsJson())) {
            JSONObject object = JSONObject.parseObject(file.getRightsJson());
            JSONArray right = object.getJSONArray("r");
            if(right!=null && right.size()>0) {
                return PermissionCalculatorFactory.haveRights(right);
            }
        }
        return true;
    }


    public boolean checkFileRights4Preview(String module) {
        return checkFileRights("r", module);
    }
    public boolean checkFileRights4PreviewDownload(String module) {
        return checkFileRights("pd", module);
    }
    public boolean checkFileRights4Download(String module) {
        return checkFileRights("d", module);
    }

    /**
     * 检查文件权限
     * @param powerType 权限类型：r-预览，pd-预览文件下载，d-原文件下载
     * @param module 文件模块
     * @return
     */
    private boolean checkFileRights(String powerType, String module) {
        if (ContextUtil.currentUserIsAdmin()) {
            return true;
        }
        if(StringUtil.isEmpty(ContextUtil.getCurrentUserId())){
            return false;
        }
        if(StringUtil.isEmpty(module)){
            module = "etech";
        }
        String sql = "select t1.rightsjson from sys_file_module_power t1, sys_file_z_module t2 where t1.filemoduleid=t2.filemoduleid and t1.powertype=? and t2.module=?";
        List<Map<String,Object>> list = DbUtil.getJdbcTemplate().queryForList(sql, powerType, module);
        if(list!=null && list.size()>0){
            JSONArray jsonRight = new JSONArray();
            for(Map<String,Object> map:list){
                if(map.get("rightsjson")!=null){
                    jsonRight.addAll(JSONArray.parseArray(map.get("rightsjson").toString()));
                }
            }
            // 调用系统权限判断
            return PermissionCalculatorFactory.haveRights(jsonRight);
        }
        return true;
    }

    private JSONObject getFileModuleRights(String module){
        JSONObject jsonRight = new JSONObject();
        String sql = "select t1.powertype, t1.rightsjson from sys_file_module_power t1, sys_file_z_module t2 where t1.filemoduleid=t2.filemoduleid and t2.module=?";
        List<Map<String,Object>> list = DbUtil.getJdbcTemplate().queryForList(sql, module);
        if(list!=null && list.size()>0){
            for(Map<String,Object> map:list){
                JSONArray rwRight = new JSONArray();
                if(map.get("rightsjson")!=null){
                    rwRight.addAll(JSONArray.parseArray(map.get("rightsjson").toString()));
                    jsonRight.put(map.get("powertype").toString(), rwRight);
                }
            }
        }
        return  jsonRight;
    }


    //检查文件的权限
    public EtechFile checkFileRights(EtechFile file) {

        // 1. 准备
        // 权限配置说明
        //r-读/预览, pd-预览文件下载, d-原文件下载, w-写权限（历史数据）
        // 先检查文件权限，再检查模块权限，权限叠加

        // 初始化   默认无权限
        boolean hasPreviewRight = false;
        boolean hasPreviewDRight = false;
        boolean hasDownloadRight = false;

        // 2、获取文件权限
        if(StringUtil.isNotEmpty(file.getRightsJson())) {
            JSONObject object = JSONObject.parseObject(file.getRightsJson());
            // a. 预览 preview
            JSONArray readRight = object.getJSONArray("r");
            if(readRight!=null && readRight.size()>0) {
                hasPreviewRight = PermissionCalculatorFactory.haveRights(readRight);
            }
            // b. 预览下载 preview download
            JSONArray previewDownRight = object.getJSONArray("pd");
            if(previewDownRight!=null && previewDownRight.size()>0) {
                hasPreviewDRight = PermissionCalculatorFactory.haveRights(previewDownRight);
            }
            // c. 原文件下载 download
            JSONArray downloadRight = object.getJSONArray("d");
            if(downloadRight!=null && downloadRight.size()>0) {
                hasDownloadRight = PermissionCalculatorFactory.haveRights(downloadRight);
            }else {
                // 兼容旧版本w权限，假定有写权限则有下载权限
                downloadRight = object.getJSONArray("w");
                if(downloadRight!=null && downloadRight.size()>0) {
                    hasDownloadRight = PermissionCalculatorFactory.haveRights(downloadRight);
                }
            }
        }

        // 3、 获取模块及模块权限配置数据
        String module = file.getModule();
        JSONObject moduleRight = getFileModuleRights(module);

        // 3.1 特管 - 通知纪要等模块
        // 默认权限开放，对当个文件特别管理
        if("special".equals(module)) {
            // 模块和文件都无权限配置则全部开放
            // 如配置特管模块special的权限则按照正常模块处理
            if (StringUtil.isEmpty(file.getRightsJson()) && moduleRight.isEmpty()) {
                hasPreviewRight = true;
                hasPreviewDRight = true;
                hasDownloadRight = true;
            }
            // 有预览权限则允许预览下载
            if (hasPreviewRight) {
                hasPreviewDRight = hasPreviewRight;
            }
        }
        // 3.2 正常模块配置(有模块权限配置）
        if(!moduleRight.isEmpty()) {

            // a. 检查预览权限
            if (!hasPreviewRight) { //如果前置检查没有预览权限，继续检查文件模块权限
                //hasPreviewRight = this.checkFileRights("r", file.getModule());
                JSONArray readRight = moduleRight.getJSONArray("r");
                if (readRight != null && readRight.size() > 0) {
                    hasPreviewRight = PermissionCalculatorFactory.haveRights(readRight);
                }
            }
            if (hasPreviewRight) {  // 如果有预览权限继续校验其他权限
                // b. 检查预览下载权限
                if (!hasPreviewDRight) {//如果前置检查没有预览文件下载权限，继续检查文件模块权限
                    //hasPreviewDRight = this.checkFileRights("pd", file.getModule());
                    JSONArray previewDownRight = moduleRight.getJSONArray("pd");
                    if (previewDownRight != null && previewDownRight.size() > 0) {
                        hasPreviewDRight = PermissionCalculatorFactory.haveRights(previewDownRight);
                    }
                }
                // c. 检查原文件下载权限
                if (!hasDownloadRight) {//如果前置检查没有原文件下载权限，继续检查文件模块权限
                    //hasDownloadRight = this.checkFileRights("d", file.getModule());
                    JSONArray downloadRight = moduleRight.getJSONArray("d");
                    if (downloadRight != null && downloadRight.size() > 0) {
                        hasDownloadRight = PermissionCalculatorFactory.haveRights(downloadRight);
                    }
                }
            }
        }
        // 3.3 无模块权限数据
        else {
            // 无模块/模块权限配置为空/错误模块名
            // 参考特管文件处理

            // TODO 默认规则可能需要调整

            // 模块和文件都无权限配置则全部开放
            if(StringUtil.isEmpty(file.getRightsJson()) && moduleRight.isEmpty()){
                hasPreviewRight = true;
                hasPreviewDRight = true;
                hasDownloadRight = true;
            }

            // 有预览权限则允许预览下载
            if (hasPreviewRight) {
                hasPreviewDRight = hasPreviewRight;
            }
        }

        // 4. 权限检查及后续处理
        // 4.1 无预览权限则限制预览页面的下载
        if(!hasPreviewRight){
            hasPreviewDRight = false;
            hasDownloadRight = false;
        }
        // 4.2 返回数据设置
        file.setHasPreviewRight4currentUser(hasPreviewRight);
        file.setHasPreviewDRight4currentUser(hasPreviewDRight);
        file.setHasDownloadRight4currentUser(hasDownloadRight);
        if (!hasPreviewRight) {
            file.setPreviewUrl(null);
        }
        //  返回前端前去掉文件权限配置
        file.setRightsJson("{}");
        return file;
    }
}
